package com.halfsword.creativecraft.modules.interfaces;

import net.minecraft.world.item.ItemStack;
import net.minecraftforge.items.ItemStackHandler;

/**
 * 物品处理功能接口
 * 提供物品槽位管理功能的模块应实现此接口
 */
public interface IItemHandlerFacet extends IMachineModule {

    /**
     * 获取输入槽位索引数组
     * @return 输入槽位索引数组
     */
    int[] getInputSlots();

    /**
     * 获取输出槽位索引数组
     * @return 输出槽位索引数组
     */
    int[] getOutputSlots();

    /**
     * 获取物品处理器
     * @return ItemStackHandler实例
     */
    ItemStackHandler getItemHandler();

    /**
     * 检查指定槽位是否可以插入物品
     * @param stack 要插入的物品堆栈
     * @param slot 槽位索引
     * @return 是否可以插入
     */
    default boolean canInsertItem(ItemStack stack, int slot) {
        if (stack.isEmpty()) return true;
        if (slot < 0 || slot >= getItemHandler().getSlots()) return false;

        ItemStack current = getItemHandler().getStackInSlot(slot);

        if (current.isEmpty()) {
            return true;
        }

        return ItemStack.isSameItemSameTags(current, stack) &&
                current.getCount() + stack.getCount() <= current.getMaxStackSize();
    }

    /**
     * 尝试将物品插入指定槽位
     * @param stack 要插入的物品堆栈
     * @param slot 槽位索引
     * @return 是否插入成功
     */
    default boolean tryInsertItem(ItemStack stack, int slot) {
        if (!canInsertItem(stack, slot)) return false;

        ItemStack current = getItemHandler().getStackInSlot(slot);

        if (current.isEmpty()) {
            getItemHandler().setStackInSlot(slot, stack.copy());
            return true;
        }

        if (ItemStack.isSameItemSameTags(current, stack)) {
            int availableSpace = current.getMaxStackSize() - current.getCount();
            if (availableSpace >= stack.getCount()) {
                current.grow(stack.getCount());
                return true;
            }
        }

        return false;
    }
}